/**
 * 基础模块
 */
layui.define(['layer'], function(exports){
	var $ 			= layui.$
		,layer		= layui.layer;
	
	// 基础API
	var base_api = {
		
		/**
		 * 加载语言包
		 */
		loadLang: function(lang=''){
			//var now_lang = localStorage.now_lang ? localStorage.now_lang : 'zh-cn';
			var now_lang = base_api.data.get('lang.now_lang');
			now_lang = base_api.isset(now_lang) ? now_lang : 'zh-cn';
			
			if(base_api.isset(lang)){
				now_lang = lang;
			}
			var tag = '<script type="text/javascript" src="/Web-Statics/js/langs/'+now_lang+'.js"></script>';
			$('body').append(tag);
		},
		
		/**
		 * 获取模板地址 url
		 * @param String url		Url请求地址；如：Index/index
		 * @param Object params		Url请求参数
		 * @param String ext		后缀名；如：html
		 * @return String
		 */
		get_tpl_url: function(url, argv={}, ext){
			var ext = ext ? ext : 'html';
			var full_url = url ? (url+'.'+ext) : '';
			var params = base_api.jsonToUrlParams(argv);
			var host = window.location.host;		// document.domain
			var protocol = base_api.isset(CONFIG.PROTOCOL) ? CONFIG.PROTOCOL : 'http';
			
			//var result = protocol +'://'+ host + '/' + full_url + '?_id=' + Math.random();
			var result = '/' + full_url + '?_id=' + Math.random();
			if(base_api.isset(params)){
				result += '&' + params;
			}
			return result;
		},
		
		/**
		 * 获取API地址
		 * @param String url		地址名称
		 * @param String ext		后缀
		 * @return String
		 */
		get_api_url: function(url, params, ext){
			var url = (typeof(url) == 'undefined') ? '' : url;
			var params = (typeof(params) != 'object') ? {} : params;
			var ext = (typeof(ext) == 'undefined') ? '' : ext;
			
			// 生成url
			var url_addr = typeof(CONFIG.API_HOST)=='undefined'?'':CONFIG.API_HOST;
			var url_arr = url.split('/');
			var app_name = typeof(CONFIG.APP_NAME)=='undefined'?'':CONFIG.APP_NAME;
			
			// URL 模式: 0 (普通模式); 1 (PATHINFO 模式); 2 (REWRITE  模式); 3 (兼容模式)  默认为PATHINFO 模式
			switch(parseInt(CONFIG.URL_MODEL)){
				// 普通模式
				case 0:
					if(url_arr.length>2){
						url_addr += '?m='+url_arr[0]+'&c='+url_arr[1]+'&a='+url_arr[2];
					}else{
						url_addr += '?m='+app_name+'&c='+url_arr[0]+'&a='+url_arr[1];
					}
					
					// 解析并组装参数
					$.each(params, function(p_k, p_v){
						url_addr += '&'+p_k+'='+p_v;
					});
					
				break;
				// PATHINFO 模式
				case 1:
					if(url_arr.length>2){
						url_addr += url_arr[0]+'/'+url_arr[1]+'/'+url_arr[2];
					}else{
						url_addr += app_name+'/'+url_arr[0]+'/'+url_arr[1];
					}
					
					// 解析并组装参数
					$.each(params, function(p_k, p_v){
						url_addr += '/'+p_k+'/'+p_v;
					});
					
					// 组装后缀名
					if(ext){
						url_addr += '.'+ext;
					}
				break;
				// REWRITE  模式
				case 2:
				break;
				// 兼容模式
				case 3:
				break;
				// PATHINFO 模式
				default:
				break;
			}
			
			return url_addr;
		},
		
		/**
		 * url 参数转 json对象
		 * @param string params_str		url格式参数字符串
		 * @return json
		 */
		urlParamsToJson: function(params_str){
			// 未申明设置
			if(!base_api.isset(params_str)){
				return {};
			}
			
			var key_val = [];
			key_val = params_str.split('&');
			
			var data_str = '{';
			
			$.each(key_val, function(i,item){
				var tmp = item.split('=');
				if(i > 0){
					data_str += ',';
				}
				//data_str += '"' + tmp[0] + '":"' + tmp[1] + '"';
				data_str += tmp[0] + ':"' + tmp[1] + '"';
			});
			
			data_str += '}';
			
			return JSON.parse(data_str);
		},
		
		/**
		 * json 转 url 参数
		 * @param Object object		键值对数据
		 * @return String
		 */
		jsonToUrlParams:function(object={}){
			var url_params = '';
			
			var i = 0;
			$.each(object, function(k, v){
				if(i>0) url_params += '&';
				url_params += k + '=' + v;
				i++;
            });
			
			return url_params;
        },
		
		/**
		 * url 重定向
		 * @param String url	跳转地址
		 * @param String ext	地址扩展名
		 */
		redirect: function(url, ext){
			var url = base_api.get_tpl_url(url, ext);
			window.location.href = url;
		},
		
		/**
		 * ajax 请求（封装）
		 * @param Object argv			请求参数
		 * @param Object callback		回调函数
		 * @param boolean outer_net		外网请求
		 */
		ajax: function(argv, callback, outer_net=false){
			var load_id = null;
			
			// ajax 参数
			var argv = (typeof(argv) == 'object') ? argv : {};
			var before = typeof(argv.before) != 'undefined' ? argv.before : true;
			var callback = (typeof(callback) == 'object') ? callback : {};
			
			// 初始化默认参数
			if(!outer_net) argv.url 			= base_api.isset(argv.url) ? base_api.get_api_url(argv.url) : '';
			argv.type 			= base_api.isset(argv.type) ? argv.type : 'post';
			argv.dataType 		= base_api.isset(argv.beforeSend) ? argv.beforeSend : 'json';
			
			// 监听请求完成前
			if(before){
				argv.beforeSend = base_api.isset(argv.beforeSend) ? argv.beforeSend : function(){
					// 弹出正在请求提示
					load_id = layer.msg(LANG.LOAD.ING, {
						icon: 16,
						shade: 0.01,
						time: 1000 * 30
					});
				};
			}
			
			// 监听请求完成后
			argv.complete = base_api.isset(argv.complete) ? argv.complete : function(){
				/**
				 * 弹出请求完成
				 * 1.关闭加载层
				 */
				
				// 1.关闭加载层
				if(base_api.isset(load_id)) layer.close(load_id);
			};
			
			// 监听请求成功
			argv.success = base_api.isset(argv.success) ? argv.success : function(result){
				// 数据格式错误
				if(typeof(result) != 'object'){
					var msg = '<i class="icon-remove" style="color:red;"> '+LANG.RESPONSE.DATA_ERROR+'</i>';
					layer.msg(msg, {
						offset: 't'
					});
				}
				
				// 请求失败
				if(parseInt(result.status) == 0){
					var msg = '<i class="icon-remove" style="color:red;"> '+result.msg+'</i>';
					layer.msg(msg, {
						icon: 5,
						offset: 't'
						//,anim: 6
					});
				}
				
				// 服务器跳转指令
				if(typeof(result.result) == 'object' && base_api.isset(result.result.flag) && result.result.flag == 'redirect'){
					var url = base_api.isset(result.result.url) ? result.result.url : 'Index/index';
					base_api.redirect(url);
				}
				
				// 设置公共数据
				if('undefined' == typeof common){
					layui.use('common');
					var common = layui.common;
				}
				// 初始化
				common.initialize(result);
				
				// 成功回调
				if(base_api.isset(callback.success)){
					callback.success(result);
				}
			};
			
			// 监听请求失败
			argv.error = base_api.isset(argv.error) ? argv.error : function(){
				var msg = '<i class="icon-remove" style="color:red;"> '+LANG.REQUEST.ERROR+'</i>';
				layer.msg(msg, {
					icon: 5,
					offset: 't',
					timeout: 1000 * 10
				});
			};
			
			// ajax 提交
			$.ajax(argv);
		},
		
		/**
		 * 模板渲染
		 * @param String tpl_id				模板ID
		 * @param Object tpl_data			模板数据
		 * @param String tpl_block_id		模板块ID
		 */
		template: function(tpl_id=null, tpl_data, tpl_block_id=null){
			if(tpl_id == null){
				return false;
			}
			
			// 检测模板是否存在
			if(!base_api.tplExists(tpl_id)){
				console.warn("模板不存在！"+tpl_id);
				return false;
			}
			
			// 模板ID
			var tpl_id = base_api.isset(tpl_id) ? tpl_id : '';
			// 模板输出ID
			var block_id = base_api.isset(tpl_block_id) ? tpl_block_id : 'main_content';
			// 模板数据
			var tpl_data = base_api.isset(tpl_data) ? tpl_data : {};
			// 渲染语言包
			if('undefined' == typeof LANG) base_api.loadLang();
			tpl_data.LANG = LANG;
			// 编译模板
			var tpl_html = template(tpl_id, tpl_data);
			// 渲染模板
			document.getElementById(block_id).innerHTML = tpl_html;
		},
		
		/**
		 * 模板是否存在
		 * @param String tpl_id		模板ID
		 * @return boolean
		 */
		tplExists: function(tpl_id){
			var tpls = $("#"+tpl_id).length;
			
			if(parseInt(tpls) == 0){
				return false;
			}
			
			return true;
		},
		
		/**
		 * 本地数据（存储资源）
		 */
		data:{
			/**
			 * 获取数据
			 * @param String key 	存储索引;支持多级索引查找
			 * @return all 
			 */
			get: function(key=null){
				var data_key = ('undefined' != typeof CONFIG && base_api.isset(CONFIG.DATA_KEY)) ? CONFIG.DATA_KEY : '__data__'
					,data = layui.data(data_key)
					,key_arr = []
					,i
					,keys = 'data'
					,result = data[key];
				
				// 非法键名
				if(!base_api.isset(key)){
					return false;
				}
				
				// 多级索引
				key_arr = key.split('.');
				if(key_arr.length > 1){
					for(i=0; i<key_arr.length; i++){
						keys += '.' + key_arr[i];
						
						if(!base_api.isset(eval(keys))){
							return undefined;
						}
					}
					
					result = eval(keys);
				}
				
				return result;
			},
			
			/**
			 * 添加存储数据
			 * @param String key		存储索引
			 * @param all value			存储值
			 * @return Boolean|String|Object
			 */
			set: function(key=null, value=null){
				var data_key = ('undefined' != typeof CONFIG && base_api.isset(CONFIG.DATA_KEY)) ? CONFIG.DATA_KEY : '__data__'
					,data = layui.data(data_key)   // 初始化数据
					,key = key
					,value = value
					,result = null;
					
				// 非法键名
				if(!base_api.isset(key) || key.indexOf('.') != -1){
					return false;
				}
				
				// 保留原索引对象数据
				if(base_api.isObject(data[key]) && base_api.isObject(value)){
					if(Object.assign){
						value = Object.assign(data[key], value);
					}else{
						$.extend(value, data[key], value);
					}
				}
				
				// 存储数据
				result = layui.data(data_key, {
					key: key,
					value: value
				});
				
				// 返回设置结果
				return result;
			},
			
			/**
			 * 删除存储数据
			 * @param String key	索引名称
			 * @return Boolean
			 */
			delete: function(key=null){
				var data_key = ('undefined' != typeof CONFIG && base_api.isset(CONFIG.DATA_KEY)) ? CONFIG.DATA_KEY : '__data__'
					,result;
					
				result = layui.data(data_key, {
					key: key,
					remove:true
				});
				
				return result;
			},
			
			/**
			 * 获取所有存储数据
			 * @return Object
			 */
			getAll: function(){
				var data_key = ('undefined' != typeof CONFIG && base_api.isset(CONFIG.DATA_KEY)) ? CONFIG.DATA_KEY : '__data__';
				return layui.data(data_key);
			}
		},
		
		/**
		 * 变量是否设置
		 * @param all argv		变量
		 * @return boolean
		 */
		isset: function(argv){
			// 未定义
			if('undefined' == typeof(argv)){
				return false;
			}
			
			// 空值
			if(argv == '' || argv == null){
				return false;
			}
			
			// 空对象
			if('object' == typeof argv && JSON.stringify(argv) == '{}'){
				return false;
			}
			
			return true;
		},
		
		/**
		 * 字符串判断
		 * @param all argv		变量
		 * @return boolean
		 */
		isString: function(argv){
			if('string' == typeof argv){
				return true;
			}
			return false;
		},
		
		/**
		 * 对象判断
		 * @param all argv		变量
		 * @return boolean
		 */
		isObject: function(argv){
			if('object' == typeof argv){
				return true;
			}
			return false;
		},
		
		/**
		 * 判断是否是数组
		 * @param all argv		变量
		 * @return boolean
		 */
		isArray: function(argv){
			if(argv instanceof Array){
				return true;
			}
			return false;
		}
		
		// base_api 方法列表...
	};
	
	// 输出基础接口
	exports('base', base_api);
});
